package jp.ac.u_tokyo.dch.util;

import java.util.ArrayList;
import java.util.HashMap;

import org.apache.commons.lang.xwork.StringUtils;
import org.apache.log4j.Logger;
import org.xml.sax.Attributes;
import org.xml.sax.helpers.DefaultHandler;

/**
 * @version 1.1
 *
 */
public class TmRealMaterialDataHandler extends DefaultHandler {
	/** ロガー */
	private Logger logger = Logger.getLogger(getClass());

	/** tab */
	private int tab = 0;
	/** currentTag */
	private String currentTag;
	/** tmpTag */
	private String tmpTag;
	/** tmSi */
	private String tmSi;
	/** tmList */
	private ArrayList<String> tmList = new ArrayList<String>();
	/** linkList */
	private ArrayList<String> linkList = new ArrayList<String>();
	/** dataMap */
	private HashMap<String, String> dataMap = new HashMap<String, String>();

	/**
	 * XML文書の開始時の処理
	 * */
	public void startDocument() {
		logger.debug("startDocument");
	}


	/**
	 * 要素の開始時の処理
	 */
	public void startElement(String namespaceURI, String localName,
			String qName, Attributes attrs) {
		logger.debug("Start Element");
		/* namespaceURIの表示 要調査 */
		if (!namespaceURI.equals("")) {
			logger.debug("namespaceURI= " + namespaceURI);
		}
		/* localNameの表示 要調査 */
		if (!localName.equals("")) {
			logger.debug("localName= " + localName);
		}
		/* タグ名を表示 */
		if (!qName.trim().equals("")) {
			logger.debug("qName= " + qName);
			currentTag = qName;

			if (!currentTag.equals("psi")) {
				tmpTag = currentTag;
				tmSi = "";
				tmList.clear();
			}
		}
		/* 属性の表示 */
		/* 属性の数はAttributesのgetLength()で取得 */
		if (attrs.getLength() != 0) {
			/* 属性の値はAttributesのgetValue(int)で取得 */
			logger.debug("attrs= " + attrs.getValue(0));

			if (currentTag.equals("psi")) {
				tmSi = attrs.getValue(0);
			}

		}
		tab++;
	}

	/**
	 *  要素の終了時の処理
	 * */
	public void endElement(String namespaceURI, String localName, String qName) {
		tab--;
		logger.debug("End element.");
		if (!namespaceURI.equals("")) {
			logger.debug("namespaceURI= " + namespaceURI);
		}
		if (!localName.equals("")) {
			logger.debug("localName= " + localName);
		}

		if (!qName.trim().equals("")) {
			logger.debug("qName= " + qName);
			if (qName.equals("psi")) {
				if (!tmList.contains(tmSi)) {
					tmList.add(tmSi);
				}
			} else if (qName.equals("links")) {
				dataMap.put("link-id", StringUtils.join(linkList, ","));
				linkList.clear();
			} else if (tmpTag.equals(qName)) {
				if (tmList != null && tmList.size() > 0) {
					// dataMap.put(tmpTag, StringUtils.join(tmList,","));
					// dataMap.put(currentTag, str);
					putDataMap(tmpTag, StringUtils.join(tmList, ","));
				}
			}
		}
		currentTag = "";
	}

	/**
	 *  XML文書の終了時の処理
	 **/
	public void endDocument() {
		logger.debug("Here is end of XML document.");
	}

	/**
	 * 文字列の処理
	 **/
	public void characters(char[] ch, int start, int length) {
		String str = new String(ch, start, length);
		if (str.length() != 0) {
			if (!currentTag.equals("psi")) {
				if (!currentTag.equals("link-id")) {
					// dataMap.put(currentTag, str);
					putDataMap(currentTag, str);
				} else {
					if (StringUtils.isNotEmpty(str) && !linkList.contains(str)) {
						linkList.add(str);
					}
				}
			}

		}
	}

	/**
	 * 処理命令を受けた時の処理 要調査
	 * */
	public void processingInstruction(String target, String data) {
	}

	/**
	 * プレフィックスによる名前空間の範囲の開始時 要調査
	 **/
	public void startPrefixMapping(String prefix, String uri) {
	}

	/**
	 * プレフィックスによる名前空間の範囲の終了時 要調査
	 **/
	public void endPrefixMapping(String prefix) {
	}

	/**
	 * @return dataMap
	 */
	public HashMap<String, String> getDataMap() {
		return dataMap;
	}

	/**
	 *
	 * @param dataMap
	 */
	public void setDataMap(HashMap<String, String> dataMap) {
		this.dataMap = dataMap;
	}

	/**
	 *
	 * @param tag
	 * @param data
	 */
	private void putDataMap(String tag, String data) {
		String val = data == null ? "" : data;
		if (dataMap.containsKey(tag)) {
			String value = dataMap.get(tag);
			value = value + "<p/>" + val;
			dataMap.put(tag, value);
		} else {
			dataMap.put(tag, val);
		}

	}
}
